%tristable1.m Model of the Tristable toggle switch based on "Prediction and
%measurement of an autoregulatory genetic module" by Farren Isaacs et al.

function dzdt=tristable2006(t,y)
%volume function
%tfinal=20;
%tLast=0;
%dt=.01;
%vray=zeros(tfinal/dt+1,2);
%vray(:,1)=0:dt:tfinal;
%vray(1,2)=1;

%for i=2:(tfinal/dt)
%    q=mod(i*dt,1);    
%    vray(i,2)=exp(log(2)*(i*dt-tLast));
%    if q==0
%        tLast=tLast+1;
%    end
    %disp(vray);
%end

%counter=1;
%while (counter<t/dt)
%    counter=counter+1;
%end
v=1;
%v=vray(counter,2);
%fprintf('V is: %4.2f    t is: %4.2f \n',v,t);
I=0;
A=0;
Tc=0;

%Constants
m=20;
%LacI
etaLT=1;
etaLA=1;
betaL=1000;
alphaL=.01;
KdI=1;
rhoI=100;
gammaL=500;
c1L=0.05;
c2L=0.05;
c3L=0.05;
c4L=0.33*(KdI+I)/(KdI+I*rhoI);

%AraC
etaAT=1;
etaAL=1;
betaA=1000;
alphaA=0.01;
KdA=1;
rhoA=100;
gammaA=500;
c1A=.33*(KdA+A)/(KdA+A*rhoA);
c2A=.33*(KdA+A)/(KdA+A*rhoA);
Aend=0;

%TetR
etaTA=1;
etaTL=1;
betaT=1000;
alphaT1=0.01;
alphaT2=0.01;
KdTc=1;
rhoTc=100;
gammaT=500;
c1T=0.05;
c2T=0.33*(KdTc+Tc)/(KdTc+Tc*rhoTc);
c3T=0.33*(KdTc+Tc)/(KdTc+Tc*rhoTc);

%YFP pTetR
etaTY=.1;
gammaY=10;

%mCherry pBAD
etaAM=.1;
gammaM=10;

%CFP pLac
etaLC=.1;
gammaC=10;

%equilibrium eq's
%LacI
d0L=m/(1+c1L*c2L*c3L*c4L*y(2)^4/v^4);
d1L=(4*c1L*c2L*c3L*c4L*y(2)^4*m)/(v^4+c1L*c2L*c3L*c4L*y(2)^4);
%TetR 
d0T=m/(1+c1T*c2T*y(1)^2/v^2+c1T^2*c2T*c3T*y(1)^4/v^3);
d1T=c1T*c2T*y(1)^2/v^2*(m/(1+c1T*c2T*y(1)^2/v^2+c1T^2*c2T*c3T*y(1)^4/v^3));
d2T=c1T^2*c2T*c3T*y(1)^4/v^3*(m/(1+c1T*c2T*y(1)^2/v^2+c1T^2*c2T*c3T*y(1)^4/v^3));
%AraC
d0A=m/(1+c1A*y(3)/v+c1A*c2A*y(3)^2/v^2);
d1A=(c1A*y(3)/v)*m/(1+c1A*y(3)/v+c1A*c2A*y(3)^2/v^2);
d2A=(c1A*c2A*y(3)^2/v^2)*m/(1+c1A*y(3)/v+c1A*c2A*y(3)^2/v^2);
%LacI
dzLdt=etaTL*betaT*(d0T+alphaT1*d1T+alphaT2*d2T)+etaAL*betaA*(d0A+d1A+alphaA*d2A)-gammaL*y(2);
dzLdL=(1+4*c1L*y(2)/v+9*c1L*c2L*y(2)^2/v^2+16*c1L*c2L*c3L*y(2)^3/v^3+16*c1L*c2L*c3L*c4L*y(2)^3*m*v^4)/(v^4+c1L*c2L*c3L*c4L*y(2)^4)^2;
%TetR
dzTdt=etaAT*betaA*(d0A+d1A+alphaA*d2A)+etaLT*betaL*(d0L+alphaL*d1L)-gammaT*y(1);
dzTdR=1+4*c1T*y(1)/v+(4*c1T*c2T*m*y(1)*v*(v^3-c1T^2*c2T*c3T*y(1)^4)+8*c1T^2*c2T*c3T*y(1)^3*m*v*(2*v^2+c1T*y(1)^2*c2T))/(v^3+c1T*y(1)^2*c2T*v+c1T^2*c2T*c3T*y(1)^4)^2;
%AraC
dzAdt=etaLA*betaL*(d0L+alphaL*d1L)+etaTA*betaT*(d0T+alphaT1*d1T+alphaT2*d2T)-gammaA*y(3)+Aend;
dzAdA=1+(c1A*m*v*(v^2-c1A*c2A*y(3)^2)+c1A*c2A*y(3)*m*v*(2*v+c1A*y(3)))/(v^2+c1A*y(3)*v+c1A*c2A*y(3)^2)^2;
%YFP pTetR
dzYdt=etaTY*betaT*(d0T+alphaT1*d1T+alphaT2*d2T)-gammaY*y(4);


%mCherry pBAD
dzMdt=etaAM*betaA*(d0A+d1A+alphaA*d2A)-gammaM*y(5);


%CFP pLac
dzCdt=etaLC*betaL*(d0L+alphaL*d1L)-gammaC*y(6);

%y1=dzT/dt y2=dzL/dt  y3=dzA/dt

dzdt = [ dzTdt/dzTdR
    dzLdt/dzLdL
    dzAdt/dzAdA
    dzYdt/dzTdR
    dzMdt/dzAdA
    dzCdt/dzLdL
    ];